//
// Created by Administrator on 2025/7/3.
//

#include "UserDataTypeListener.h"
#include <QCryptographicHash>
void UserDataTypeListener::on_data_available(DataReader *reader) {
    UserDataTypeDataReader *UserDataType_reader = NULL;
    UserDataTypeSeq data_seq;
    SampleInfoSeq info_seq;
    ReturnCode_t retcode;
    int i;
/* 利用reader，创建一个读取UserDataType类型的UserDataType_reader*/
    UserDataType_reader = UserDataTypeDataReader::narrow(reader);
    if (UserDataType_reader == NULL) {
        fprintf(stderr, "DataReader narrow error\n");
        return;
    }
/* 获取数据，存放至data_seq，data_seq是一个队列 */
    retcode = UserDataType_reader->read(
            data_seq, info_seq, DDS_LENGTH_UNLIMITED, DDS_ANY_SAMPLE_STATE,
            DDS_ANY_VIEW_STATE, DDS_ANY_INSTANCE_STATE);
    if (retcode == RETCODE_NO_DATA) {
        return;
    }
    else if (retcode != RETCODE_OK) {
        fprintf(stderr, "take error %d\n", retcode);
        return;
    }
/* 打印数据 */
/* 建议1：避免在此进行复杂数据处理 */
/* 建议2：将数据传送到其他数据处理线程中进行处理 *
/* 建议3：假如数据结构中有string类型，用完后需手动释放 */
//    std::this_thread;
    for (i = 0; i < data_seq.length(); ++i) {
        QByteArray md5=QCryptographicHash::hash(data_seq[i].message,QCryptographicHash::Md5).toHex();
        if(strcmp(md5.data(),data_seq[i].md5)==0)
        {
            std::cout<<"message ="<<data_seq[i].message <<"  md5 "<<data_seq[i].md5<<std::endl;
        }
        else
        {
            std::cout<<"md5不匹配 ="<<data_seq[i].md5<<" 计算"<<md5.data()<<std::endl;
        }
    }
}
